import com.example.kotlindemo.Students

/**
 * Author zss
 *2022/8/5 17:06
 *
 *Unit2
 *describe：Kotlin基本数据类型
 **/
/**
 * 基本数据类型
 * 类型     位宽度
 * Double 64
 * Float 32
 * Long     64
 * Int     32
 * Short 16
 * Byte     8
 */
class Unit2 {
    fun baseData() {
        val num1: Int = 123 //十进制
        val num2: Long = 123L //长整形
        val num3: Int = 0b101 //二进制0b开头
        val num4: Int = 0x0f  //十六进制0x开头
        //注意 Kotlin不支持二进制
        println(num3)
        println(num4)
    }

    /**
     *  数字比较
     *  1."=="用于比较数字大小
     *  2."==="用于比较数字大小&&地址是否一样
     *  3.因为-128-127是byte的取值范围，在此范围内自动拆装箱不会创建新对象，从常量池中直接获取，如果超出取值范围，就会重新创建对象。
     *  num1：Int = 128， num2：Int = 128，而a1==b1返回false的原因。
     */
    fun compareFun() {
        val a: Int = 128
        println(a == a) //比较a和a的值
        println(a === a) //比较a和a的地址是否一致
        val num1: Int? = a
        val num2: Int? = a
        println(num1 == num2)//比较num1和num2的值
        println(num1 === num2)//比较num1和num2的地址是否一致
    }

    /**
     * 类型转换
     */
    fun kindChange(obj: String) {
        println(obj.toInt())
        println(obj.toLong())
        println(obj.toByte())
        println(obj.toFloat())
        println(obj.toDouble())
        println(obj.toByte())
    }

    /**
     * 位操作符
     * shl(bit) - 左位移符（java`s <<）
     * shr(bit) - 右位移符（java`s <<）
     * ushr(bits) – 无符号右移位 (Java’s >>>)
     * and(bits) – 与
     * or(bits) – 或
     * xor(bits) – 异或
     * inv() – 反向
     */
    fun psotionFun() {

    }

    /**
     * 字符
     * 1.Char 修饰的字符不可以直接跟数字进行比较，需要加上''符号
     * 2.转义字符：特殊的符号需要使用到转译字符。
     */
    fun charFun(c: Char) {
//    if (c == 1){//错误比较，Char 修饰的字符不可以直接跟数字进行比较，需要加上''符号
//    }
        if (c == '1') {
            println("true")
        }
//        转义字符：特殊的符号需要使用到转译字符。常见的转义字符有\t、 \b、\n、\r、\'、\"、\\ 和 \$ 编码其他字符要用 Unicode 转义序列语法：'\uFF00
        println("\t")
        println("\b")
        println("\n")
        println("\r")
        println("\'")
        println("\"")
        println("\\")
        println("\$")
        println(c)
        if (c in '0'..'9') {
            println(c.toInt() - '0'.toInt())
        }
    }
    /**
     * 布尔类型:||、&&、!
     */

    /**
     * 数组
     * 1.通过函数arrayOf创建
     * 2.通过工厂窗创建
     */
    fun arraryFun() {
        println("通过函数arrayOf创建")
        var arr = arrayOf(1, 2, 3, 4)
        for (i in arr) {
            println(i)
        }
        println("通过工厂窗创建")
        var arr2 = Array(4, { i: Int -> i * 2 })//表示依次往数组中加入四位整形的数字，i表示次数
        for (i in arr2) {
            println(i)
        }
    }


    /**
     * 字符串
     * 1. 字符串可以通过for来遍历
     * 2.支持 “”“括起来的多行字符串
     * 3.可以通过 trimMargin来删除多余的空格
     * trim：去除字符串前后空格
     * trimStart：去除字符串前面的空格
     * trimEnd：去除字符串后面的空格
     * trimMargin() 函数默认使用 "|" 来作为边界字符：但你可以选择其他字符并作为参数传入，比如 trimMargin(">") 。
     * trimIndent() 函数，则是把字符串行的左边空白对齐切割：
     */
    fun strFun(str: String) {
        for (c in str) {
            println(c)
        }
        val str1 = """
            >1
            >2
            >3
            >4
            >""".trimMargin(">")
        println(str1.length)
        println(str1)

        var str2 = str1.trimMargin()
        println(str2.length)
        println(str2)
    }
    /**
     * 字符串模版
     * 1. 字符串可以包含模板表达式 ，即一些小段代码，会求值并把结果合并到字符串中。 模板表达式以美元符（$）开头，由一个简单的名字构成
     * 2.用花括号扩起来的任意表达式
     * 3.原生字符串和转义字符串内部都支持模板。 如果你需要在原生字符串git中表示字面值 $ 字符（它不支持反斜杠转义）
     */
    fun templateFun(str: String){
        println("$str")
        var student = Students("张三", 12)

        println("${student.name}")

        println("${'$'}${student.age}")
    }

}
